package com.all.learning.guava.concurrent.domain;



import com.google.common.util.concurrent.Monitor;

public class MonitorTask implements Runnable {
	private final Monitor monitor = new Monitor();
	private volatile boolean condition = true;
	private Monitor.Guard conditionGuard = new Monitor.Guard(monitor) {
		@Override
		public boolean isSatisfied() {
			return condition;
		}
	};
	
	@Override
	public void run() {
//		System.out.println("---开始---");
//		 try {
//			monitor.enterWhen(conditionGuard);//符合条件，进入Monitor块,阻塞其他线程,直到Monitor.leave,如果不符合条件,一直阻塞.
//			condition = false;
//			TimeUnits.sleep(2);
//			monitor.leave();
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		 System.out.println("---结束---");
		 
		 
		
//		System.out.println("---开始---");
//		monitor.enter();//进入Monitor块，将阻塞其他线程,直到Monitor.leave
//		TimeUnits.sleep(2);
//		monitor.leave();
//		System.out.println("---结束---");
		
		
//		System.out.println("---开始---");
//		if(monitor.enterIf(conditionGuard)){
//			System.out.println("if");//符合条件，进入Monitor块,阻塞其他线程,直到Monitor.leave,如果不符合条件，则执行else(必须等Monitor.leave)
//			condition = false;
//			TimeUnits.sleep(5);
//			monitor.leave();
//		}else{
//			System.out.println("else条件: "+Thread.currentThread().getName());
//		}
//		
//		System.out.println("---结束---"+Thread.currentThread().getName());
		
		
		
//		System.out.println("---开始---");
//		if(monitor.tryEnter()){//尝试进入，成功进入以后自动上锁，tryEnterIf返回false,释放之前其他线程都无法进入,但是不阻塞,其他线程执行后续的else条件(不用等到Monitor.leave)
//			System.out.println("if条件: "+Thread.currentThread().getName());
//			TimeUnits.sleep(6);
//			monitor.leave();
//		}else{
//			System.out.println("else条件: "+Thread.currentThread().getName());
//		}
//		System.out.println("---结束---"+Thread.currentThread().getName());
		
		
//		System.out.println("---开始---");
//		if (monitor.tryEnterIf(conditionGuard)) {//符合条件，进入Monitor块,成功进入以后自动上锁,tryEnterIf返回false,释放之前其他线程都无法进入,但是不阻塞,执行后续的语句（或者else）
//			try {
//				System.out.println("11进入if11");
//				TimeUnits.sleep(4);
//				System.out.println("22进入if22");
//			} finally {
//				monitor.leave();
//			}
//		}
//		System.out.println("---结束---");
		
//		else {
//			System.out.println("进入else");
//		}
	}

}
